package top.wuchu.rpc.entity;

import lombok.Data;
import lombok.NoArgsConstructor;
import top.wuchu.rpc.enumeration.ResponseCode;

import java.io.Serializable;

/**
 * 提供者执行完成或出错后向消费者返回的结果对象
 * @author Wuchu
 */
@Data
@NoArgsConstructor
public class RpcResponse<T> implements Serializable {

    /**
     * 响应对应的请求号
     */
    private String requestId;
    /**
     * 响应状态码
     */
    private Integer statusCode;
    /**
     * 响应状态补充信息
     */
    private String message;
    /**
     * 响应数据
     */
    private T data;

    /**
     * 使用静态方法是因为静态方法在类加载的时候就会初始化，这样就可以更快的生成succeed或fail对象
     * 静态方法：先于其他方法初始化，系统会为静态方法分配一个固定的内存空间（方法区中的静态方法区），只会被初始化一次。
     * 而普通方法，会随着对象的调用而加载，当使用完毕，会自动释放掉空间。
     * 普通方法的好处是，动态规划了内存空间的使用，节省内存资源。静态方法，方便，运行快，而如果全部方法都用静态方法，
     * 那么每个方法都要有一个固定的空间，这样的话太占内存。
     * 拓展：Java方法区存的是什么样的东西？
     *      方法区存着类的信息，常量和静态变量，即类被编译后的数据。（线程共享的）
     * @param data
     * @param requestId
     * @return
     * @param <T>
     */
    public static <T> RpcResponse<T> success(T data, String requestId) {
        RpcResponse<T> response = new RpcResponse<>();
        response.setRequestId(requestId);
        response.setStatusCode(ResponseCode.SUCCESS.getCode());
        response.setData(data);
        return response;
    }

    public static <T> RpcResponse<T> fail(ResponseCode code, String requestId) {
        RpcResponse<T> response = new RpcResponse<>();
        response.setRequestId(requestId);
        response.setStatusCode(code.getCode());
        response.setMessage(code.getMessage());
        return response;
    }

}
